package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.DocumentoOrdenEnvio;
import com.app.sgd.model.bean.ExpedienteBCA;
import com.app.sgd.model.bean.ModalidadEnvio;
import com.app.sgd.model.bean.Usuario;
import com.app.sgd.plugin.JNDIConnector;
import com.app.sgd.util.Constants;
import com.app.sgd.view.vo.FiltroBusquedaVO;

public class SQLModalidadEnvioDAO {
private static Logger logger = Logger.getLogger(SQLModalidadEnvioDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
	public ArrayList listarOrdenesEnvio(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstModalidadEnvio = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_lst_ordenes_envio(?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setString(1, filtroBusquedaVO.getNroOrden());
            call.setInt(2,Integer.parseInt(filtroBusquedaVO.getCodModalidadEnvio()));
            call.setString(3, filtroBusquedaVO.getFechaInicio());
            call.setString(4, filtroBusquedaVO.getFechaFin());
            call.setInt(5,Integer.parseInt(filtroBusquedaVO.getCodCourier()));
//            logger.info("SQL = " + vSQL);
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            int ind=0;
            while(rs.next()){
            	ModalidadEnvio modalidadEnvio = new ModalidadEnvio();
            	modalidadEnvio.setIndice(String.valueOf(ind++));
            	modalidadEnvio.setCodigoOrden(rs.getString("Id"));
            	modalidadEnvio.setNroOrden(rs.getString("NroModEnv").trim());
            	modalidadEnvio.setCodModalidadEnvio(rs.getString("ModEnvio"));
            	modalidadEnvio.setDescModalidadEnvio(rs.getString("DescModEnvio").trim());
            	modalidadEnvio.setFechaEmision(rs.getString("FechaEmision"));
            	modalidadEnvio.setCodCourier(rs.getString("codCourier"));
            	modalidadEnvio.setDescCourier(rs.getString("Courier").trim());
            	modalidadEnvio.setCodEstado(rs.getString("Estado"));
            	modalidadEnvio.setDescEstado(rs.getString("Estado").trim());
            	modalidadEnvio.setLocalidad(rs.getString("Localidad"));
            	modalidadEnvio.setFechaEntregaCourier(rs.getString("FechaEntregaCourier"));
            	
            	if(modalidadEnvio.getLocalidad()!=null){
            		if(modalidadEnvio.getLocalidad().compareTo("L")==0){
            			modalidadEnvio.setDescripcionLocalidad("Lima");
            		}
            		else{
            			if(modalidadEnvio.getLocalidad().compareTo("P")==0){
                			modalidadEnvio.setDescripcionLocalidad("Provincias");
                		}
            		}
            	}
            	
            	lstModalidadEnvio.add(modalidadEnvio);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarOrdenesEnvio: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstModalidadEnvio;
	}
	
	public int eliminarOrdenesEnvio(ArrayList lstOrdenesEnvio) throws Exception {
		int resultado = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
			for(Iterator it=lstOrdenesEnvio.iterator();it.hasNext();){
				ModalidadEnvio modalidadEnvio = (ModalidadEnvio)it.next();
				
		    	String vSQL = "{call std_sp_elim_ordenes_envio(?)}";
		    	call = conn.prepareCall(vSQL);
	            call.setInt(1,Integer.parseInt(modalidadEnvio.getCodigoOrden()));
	//            logger.info("SQL = " + vSQL);
	            logger.info("inicio:" + new Date());
	            resultado = call.executeUpdate();
	            logger.info("fin: " + new Date());
			}
		}catch(Exception e){
			logger.error("[STD]: Error en eliminarOrdenesEnvio: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return resultado;
	}
	
	public ModalidadEnvio listarDocumentosOrdenEnvio(ModalidadEnvio modalidadEnvio,String codOficinaFiltro) throws Exception {
		ModalidadEnvio modalidadEnvioRet = new ModalidadEnvio();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_lst_docs_orden_envio(?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(1,Integer.parseInt(modalidadEnvio.getCodigoOrden()));
	    	call.setInt(2,Integer.parseInt(codOficinaFiltro));
//            logger.info("SQL = " + vSQL);
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            
            ArrayList lstDocumentosOrden = new ArrayList();
            modalidadEnvioRet = modalidadEnvio;
            int ind=0;
            while(rs.next()){
            	DocumentoOrdenEnvio documentoOrdenEnvio = new DocumentoOrdenEnvio();
            	documentoOrdenEnvio.setIndiceDocumento(String.valueOf(ind++));
            	documentoOrdenEnvio.setCodOrdenEnvio(rs.getString("Id"));
            	documentoOrdenEnvio.setCodSeguimiento(rs.getString("IdSeg"));
            	documentoOrdenEnvio.setCodDocumento(rs.getString("IdDoc"));
            	documentoOrdenEnvio.setCodDocumentoCargo(rs.getString("IdDocCargo"));
            	documentoOrdenEnvio.setFlgCargo(rs.getString("Cargo"));
            	documentoOrdenEnvio.setNumDocumento(rs.getString("NumDoc"));
            	documentoOrdenEnvio.setNumRegistro(rs.getString("NroRegDoc"));
            	documentoOrdenEnvio.setDescTipoDocumento(rs.getString("Tipo"));
            	documentoOrdenEnvio.setFechaRecepcion(rs.getString("FechaRecepcion"));
            	documentoOrdenEnvio.setHoraRecepcion(rs.getString("HoraRecepcion"));
            	documentoOrdenEnvio.setNumUsuarioSeguimiento(rs.getString("NroFilaSeg"));
            	documentoOrdenEnvio.setFechaCreacion(rs.getString("fechaCreacion"));
            	documentoOrdenEnvio.setHoraCreacion(rs.getString("horaCreacion"));
            	documentoOrdenEnvio.setAsunto(rs.getString("asunto"));
            	documentoOrdenEnvio.setFechaEnvio(rs.getString("fechaEnvio"));
            	documentoOrdenEnvio.setFechaDocumento(rs.getString("fechaDocumento"));
            	documentoOrdenEnvio.setObservaciones(rs.getString("observaciones"));
            	documentoOrdenEnvio.setCodExpedienteBCA(rs.getString("codExpedienteBCA"));
            	documentoOrdenEnvio.setNumExpedienteBCA(rs.getString("numExpedienteBCA"));
            	documentoOrdenEnvio.setNombreEntidadDestino(rs.getString("entidadDestino"));
            	documentoOrdenEnvio.setSigEntidadEmisor(rs.getString("siglasArea"));
            	documentoOrdenEnvio.setDescEstado(rs.getString("descEstado"));
            	documentoOrdenEnvio.setObsAdiCargo(rs.getString("obsAdiCargo"));
            	lstDocumentosOrden.add(documentoOrdenEnvio);
            }
            modalidadEnvioRet.setLstDocumentosOrden(lstDocumentosOrden);
            
		}catch(Exception e){
			logger.error("[STD]: Error en listarDocumentosOrdenEnvio: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return modalidadEnvioRet;
	}
	
	
	public ArrayList buscarDocumentosOrdenEnvio(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentosOrden = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_get_docs_orden_envio(?,?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
	    	call.setString(2,filtroBusquedaVO.getNumDocumento());
	    	call.setString(3,filtroBusquedaVO.getAsunto());
	    	call.setString(4,filtroBusquedaVO.getFechaInicio());
	    	call.setString(5,filtroBusquedaVO.getFechaFin());
	    	call.setInt(6,Integer.parseInt(filtroBusquedaVO.getCodOficina()));
//            logger.info("SQL = " + vSQL);
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());

            int ind=0;
            while(rs.next()){
            	DocumentoOrdenEnvio documentoOrdenEnvio = new DocumentoOrdenEnvio();
            	documentoOrdenEnvio.setIndiceDocumento(String.valueOf(ind++));
            	documentoOrdenEnvio.setCodSeguimiento(rs.getString("IdSeg"));
            	documentoOrdenEnvio.setCodDocumento(rs.getString("IdDoc"));
            	documentoOrdenEnvio.setNumDocumento(rs.getString("NumDoc"));
            	documentoOrdenEnvio.setNumRegistro(rs.getString("NroRegDoc"));
            	documentoOrdenEnvio.setDescTipoDocumento(rs.getString("Tipo"));
            	documentoOrdenEnvio.setNumUsuarioSeguimiento(rs.getString("NroFilaSeg"));
            	documentoOrdenEnvio.setSigEntidadEmisor(rs.getString("EntidadEmisor"));
            	documentoOrdenEnvio.setNombreEntidadDestino(rs.getString("EntidadDestino"));
//            	documentoOrdenEnvio.setNombreDestinatario(rs.getString("Destinatario"));
            	documentoOrdenEnvio.setAsunto(rs.getString("Asunto"));
            	documentoOrdenEnvio.setFechaDocumento(rs.getString("FechDoc"));
            	documentoOrdenEnvio.setFechaEnvio(rs.getString("FechEnvio"));
            	documentoOrdenEnvio.setFechaCreacion(rs.getString("fechaCreacion"));
            	documentoOrdenEnvio.setHoraCreacion(rs.getString("horaCreacion"));
            	documentoOrdenEnvio.setObservaciones(rs.getString("observaciones"));
            	
            	documentoOrdenEnvio.setFechaRecepcion(new String());
            	documentoOrdenEnvio.setHoraRecepcion(new String());
            	documentoOrdenEnvio.setFlgCargo(Constants.NO);
            	
            	lstDocumentosOrden.add(documentoOrdenEnvio);
            }
            
            
		}catch(Exception e){
			logger.error("[STD]: Error en buscarDocumentosOrdenEnvio: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentosOrden;
	}
	
	public int actualizarDocumentosOrdenEnvio(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
			ArrayList lstDocumentosOrdenEliminar = filtroBusquedaVO.getModalidadEnvio().getLstDocumentosOrdenEliminar();
			for(Iterator it=lstDocumentosOrdenEliminar.iterator();it.hasNext();){
				DocumentoOrdenEnvio documentoOrdenEnvio = (DocumentoOrdenEnvio)it.next();
				
				String vSQL = "{call std_sp_elim_docs_orden_envio(?,?)}";
				
				call = conn.prepareCall(vSQL);
				call.setInt(1,Integer.parseInt(filtroBusquedaVO.getModalidadEnvio().getCodigoOrden()));
				call.setInt(2,Integer.parseInt(documentoOrdenEnvio.getCodSeguimiento()));
				res = call.executeUpdate();
			}
			
			ArrayList lstDocumentosOrden = filtroBusquedaVO.getModalidadEnvio().getLstDocumentosOrden();
			for(Iterator it=lstDocumentosOrden.iterator();it.hasNext();){
				DocumentoOrdenEnvio documentoOrdenEnvio = (DocumentoOrdenEnvio)it.next();
				
				try{
					String vSQL = "{call std_sp_grabar_doc_orden_envio(?,?,?,?,?,?,?)}";
					call = conn.prepareCall(vSQL);
					call.setInt(1,Integer.parseInt(filtroBusquedaVO.getModalidadEnvio().getCodigoOrden()));
					call.setInt(2,Integer.parseInt(documentoOrdenEnvio.getCodDocumento()));
					call.setInt(3,Integer.parseInt(documentoOrdenEnvio.getCodSeguimiento()));
					call.setString(4,documentoOrdenEnvio.getFlgCargo());
					call.setString(5,documentoOrdenEnvio.getFechaRecepcion());
					call.setString(6,documentoOrdenEnvio.getHoraRecepcion());
					call.setString(7,documentoOrdenEnvio.getObsAdiCargo());
					res = call.executeUpdate();
					
//					GRABAR CARGO EN ESTADOS DEL EXPEDIENTE DEL SAU
					try{
						ingresarCargoDocumentoSAU(documentoOrdenEnvio,filtroBusquedaVO.getUsuario());
					}catch(Exception e){e.printStackTrace();}
					
				}catch(Exception e){
					logger.error("[STD]: Error en documentoOrdenEnvio "+documentoOrdenEnvio.getCodDocumento() + " " + e.getMessage());
				}
			}
			
		}catch(Exception e){
			logger.error("[STD]: Error en actualizarDocumentosOrdenEnvio: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
	
	public void ingresarCargoDocumentoSAU(DocumentoOrdenEnvio documentoOrdenEnvio, Usuario usuario){
		FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
		OracleExpedienteDAO oracleExpedienteDAO = new OracleExpedienteDAO();
		ExpedienteBCA expedienteBCA = new ExpedienteBCA();
		try{
			if(documentoOrdenEnvio.getFlgCargo().equals(Constants.SI) && !documentoOrdenEnvio.getCodExpedienteBCA().equals(Constants.VALOR_DEFAULT_CERO)){
				expedienteBCA.setCodigoTipoExpedienteBCA(Constants.VALOR_DEFAULT_CERO);
				expedienteBCA.setNumeroExpediente(documentoOrdenEnvio.getCodExpedienteBCA());
				
				String numProveido = documentoOrdenEnvio.getNumRegistro()+"-"+documentoOrdenEnvio.getNumUsuarioSeguimiento();
				String asunto = documentoOrdenEnvio.getAsunto().trim();
				if(asunto == null || asunto.equals(Constants.VALOR_DEFAULT_VACIO)){
					asunto = "STD - Salida. CARGO DEL PROV.: " + numProveido + "<br>" +
							 "DESTINO: "+documentoOrdenEnvio.getNombreEntidadDestino() + "<br>" +
							 "TIPO DOC.: " + documentoOrdenEnvio.getDescTipoDocumento() + " " + (documentoOrdenEnvio.getNumDocumento().equals(Constants.DOCUMENTO_SIN_NUMERO) ? Constants.VALOR_DEFAULT_VACIO : documentoOrdenEnvio.getNumDocumento()) + "<br>" +
							 "ASUNTO: (DOCUMENTO SIN ASUNTO) <br>" ;
				}
				else{
					asunto = "STD - Salida. CARGO DEL PROV: " + numProveido + "<br>" +
							 "DESTINO: "+documentoOrdenEnvio.getNombreEntidadDestino() + "<br>" +
							 "TIPO DOC.: " + documentoOrdenEnvio.getDescTipoDocumento() + " " + (documentoOrdenEnvio.getNumDocumento().equals(Constants.DOCUMENTO_SIN_NUMERO) ? Constants.VALOR_DEFAULT_VACIO : documentoOrdenEnvio.getNumDocumento()) + "<br>" +
							 "ASUNTO: "+documentoOrdenEnvio.getAsunto().trim() + "<br>" ;
				} 
				
				filtroBusquedaVO.setCodDocumento(documentoOrdenEnvio.getCodDocumento());
				filtroBusquedaVO.setExpedienteBCA(expedienteBCA);
				filtroBusquedaVO.setNumDocumento(documentoOrdenEnvio.getNumDocumento());
				filtroBusquedaVO.setNumProveido(numProveido);
				filtroBusquedaVO.setAsunto(asunto);
				filtroBusquedaVO.setUsuario(usuario);
				filtroBusquedaVO.setFechaRecepcion(documentoOrdenEnvio.getFechaRecepcion());
				
				oracleExpedienteDAO.insertarCargoEstadoExpedienteBCA(filtroBusquedaVO);
			}
		}catch(Exception e){e.printStackTrace();}
	}
	
	public int grabarOrdenEnvio(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		int resultado = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		int codOrden = 0;
		try{
			conn = cn.connect().getConnection();
			
	    	String vSQL = "{call std_sp_grabar_orden_envio(?,?,?,?,?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
            call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodOrden()));
            call.setInt(2,Integer.parseInt(filtroBusquedaVO.getCodModalidadEnvio()));
            call.setInt(3,Integer.parseInt(filtroBusquedaVO.getCodCourier()));
            call.setString(4, filtroBusquedaVO.getNroOrden());
            call.setString(5, filtroBusquedaVO.getFechaEmision());
            call.setString(6, filtroBusquedaVO.getCodEstado());
            call.setString(7, filtroBusquedaVO.getLocalidad());
            call.setString(8, filtroBusquedaVO.getFechaEntregaCourier());
            call.registerOutParameter(9, Types.INTEGER);
            
            logger.info("inicio:" + new Date());
            resultado = call.executeUpdate();
            codOrden = call.getInt(9);
            logger.info("fin: " + new Date());
		}catch(Exception e){
			logger.error("[STD]: Error en grabarOrdenEnvio: " + e.getMessage());
			codOrden = 0;
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return codOrden;
	}
}
